# NumPy 的切片（Slicing）是操作数组数据的核心功能之一，它允许你高效地提取数组的子集（视图或副本）。理解 NumPy 切片的关键在于掌握其‌多维索引规则‌和‌视图机制‌。以下是分步详解：
import numpy as np

arr = np.array([0, 1, 2, 3, 4, 5])

# 提取索引 1 到 3（不包括3）
print(arr[1:3])  # 输出: [1 2]

# 从索引2开始到末尾
print(arr[2:])   # 输出: [2 3 4 5]

# 步长为2
print(arr[::2])  # 输出: [0 2 4]

# 反向切片
print(arr[::-1]) # 输出: [5 4 3 2 1 0]



print("==========================")

arr_2d = np.array([[1, 2, 3],
                   [4, 5, 6],
                   [7, 8, 9]])

# 取第0行到第1行（不含第2行），所有列
print(arr_2d[0:2, :])
# 输出:
# [[1 2 3]
#  [4 5 6]]

# 取所有行，第1列到末尾
print(arr_2d[:, 1:])
# 输出:
# [[2 3]
#  [5 6]
#  [8 9]]

# 步长组合（行步长1，列步长2）
print(arr_2d[::1, ::2])
# 输出:
# [[1 3]
#  [4 6]
#  [7 9]]

# 省略号（Ellipsis）与 newaxis
# 用于简化高维数组操作，自动填充未指定的维度为全选

arr_3d = np.random.rand(2, 3, 4)  # 形状 (2,3,4)
print(arr_3d[..., 0])  # 等同于 arr_3d[:, :, 0]


# np.newaxis‌：插入新维度，用于升维。

arr = np.array([1, 2, 3])
print(arr.shape)        # (3,)
print(arr[:, np.newaxis].shape)  # (3, 1)


# 视图（View）‌：默认情况下，切片返回原数组的‌视图‌（共享内存），修改切片会影响原数组。
arr = np.array([0, 1, 2, 3])
sub_arr = arr[1:3]
sub_arr = 100
print(arr)  # 输出: [0 100 2 3]

# 使用 .copy() 显式创建独立副本。
sub_arr_copy = arr[1:3].copy()
sub_arr_copy = 200
print(arr)  # 输出不变: [0 100 2 3]


"""
‌核心规则‌：每个维度用 start:stop:step 指定范围，逗号分隔不同维度。
‌视图机制‌：切片默认共享内存，修改需谨慎。
‌多维能力‌：可同时对多维度操作，适用于图像处理、科学计算等场景。
"""
